#include "Geral.h"
#include <stdio.h>
#include <stdlib.h>

int iPermut = 0;

int **Construir_matriz (char arquivo[]){
    int **v;  /* ponteiro para a matriz */
    FILE *fp;  
    int   i,j, count = 0, a;    /* variavel auxiliar      */

    /*abre o arquivo*/
    fp=fopen (arquivo,"r");
    if (!fp){
        printf ("Erro na abertura do arquivo. Fim de programa.");
        exit (1);
    }

    /*Le a qtd de vertices*/
    if(!feof(fp))
        fscanf(fp,"%d\n",&n);

    printf("%d\n", n);    

    if (n < 1) { /* verifica a qtd de vertices */
       printf ("** Erro: Parametro invalido **\n");
       exit (1);
    }
     
     /* aloca as linhas da matriz */
     v = (int **) calloc (n, sizeof(int *));
     if (v == NULL) {
        printf ("** Erro: Memoria Insuficiente **");
        exit (1);
     }
     /* aloca as colunas da matriz */
     for ( i = 0; i < n; i++ ) {
         v[i] = (int*) calloc (n, sizeof(int));
         if (v[i] == NULL) {
            printf ("** Erro: Memoria Insuficiente **");
            exit (1);
         }
     }
     
     /*monta a matriz do grafo*/
	 while (!feof(fp))
 	 {          
  		fscanf(fp,"%d ",&a);
  		v[count/n][count%n] = a;
  		count++;
  	}
    /*imprime a matriz do grafo*/  	
  	for(i = 0; i<n; i++)
  	    for (j=0;j<n;j++){              
  	        printf("%d ",v[i][j]);
  	        if(j == (n-1) )
                 printf("\n");
        }
        
    /*abre o arquivo*/    
	fclose(fp);
	
    return (v);
}

int **Liberar_matriz(int **v)
{
    int  i;  /* variavel auxiliar */
    if (v == NULL) 
        return (NULL);

    if (n < 1 ) {  /* verifica parametros recebidos */
        printf ("** Erro: Parametro invalido **\n");
        return (v);
    }
     
    for (i=0; i<n; i++) 
        free (v[i]); /* libera as linhas da matriz */
  
    free (v);      /* libera a matriz */
    
    return (NULL); /* retorna um ponteiro nulo */
}





int** criaVetorPermutacoes(int n) {
   int nPermut = fatorial(n);
   int** permutacoes = (int**) calloc (nPermut, sizeof(int*));
   
   int i = 0;
   for (i = 0; i<nPermut; i++ ) {
       permutacoes[i] = (int*) calloc (n, sizeof(int));
   }
   return permutacoes;
}


int fatorial(int n) {
    if (n>1) {
        return n * fatorial(n-1);
    } else {
        return n;
    }
}

// copia v2 para v1
void copia(int* v1, int* v2, int n) {
     int i = 0;
     for (i=0; i<n; i++) {
         v1[i] = v2[i];
     }
}

void print(FILE* arq, const int *v, const int size){
     if (v != 0) {
        int i;
        for (i = 0; i < size; i++) {
           fprintf(arq, "%4d", v[i] );
        }
        //fprintf(arq, "\n");
     }
}


int* geraVetorOrdem(int n) {
     int* vetor = (int*) calloc (n, sizeof(int));
     int i=0;
     for (i=0; i<n; i++) {
         vetor[i] = i;
     }
     return vetor;
}


void geraPermutacoes(int *v, const int start, const int n) { 
     if (start == n-1) {
        copia(permutacoes[iPermut], v, n);
        iPermut++;
     } else {
        int i;
        for (i = start; i < n; i++) {
            int tmp = v[i];
            v[i] = v[start];
            v[start] = tmp;
            geraPermutacoes(v, start+1, n);
            v[start] = v[i];
            v[i] = tmp;
        }
     }
}
